package 对象_序列专属;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 *   序列化对象的步骤：
 *   
 *      1  *创建一个类实现Serializable接口
 *      	通过源代码发现 Serializable接口只是一个标志接口  里面什么代码都没有
 *      	它起到一个标识，标志的作用，JVM看到这个接口 就知道这个类是可序列化和反序列化的。
 *      	Serializable这个标识接口是给JVM参考的，JVM看到这个接口后，会为该类自动生成一个序列化版本号。
 *      	自动生成的序列化版本号缺点：一旦代码确认会后，不能进行后续的修改，因为只要修改，会重新编译，再生成新的序列化
 *      	版本号，此时JVM会认为这是一个全新的类。
 *      
 *      	最终结论：
 *      		凡是一个类实现了Serializable接口，建议给该类提供一个固定不变的序列化版本号。
 *      		这样，即使进行后续代码的修改，但版本号不变，JVM也会认为这是同一个类。
 *
 *      *序列化版本号的作用*：
 *      		java语言中采用什么机制来区分类的？
 *      			第一：首先通过类名进行比对，若果类名不一致，肯定不是同一类
 *      			第二：如果类名一致，再怎么进行类的区别，靠序列化版本号进行区分。
 *      	关键字：transient 表示游离的，不参与序列化，当对象序列化时，某个类不参与序列化，可以用transient修饰。
 *      
 *      
 *      2  创建一个对象
 *      3  创建输出流
 *      4  创建序列化流
 *      5  调用writeObjet();
 *      6  刷新
 *      7  关闭资源
 *      
 *  注意事项：
 *  	1.**如果自定义类没有指定序列化号，生成序列化后，在改变自定义类时，会报异常。**
 *  		java.io.InvalidClassException
 *  	2.静态关键字不能使用在序列化类的属性上
 *  	3.自定义类里面的属性，也是自定义类，那么该自定义也需要实现Serializable接口。
 *  
 */

public class ObjectOutputStreamTest01 {

	public static void main(String[] args) throws IOException {
		//序列化  从内存（程序）输出到硬盘上。
		
		//1.创建一个对象
		Student stu = new Student("秦浩然",26);
		
		//2.创建输出流
		FileOutputStream fos = new FileOutputStream("D");
		
		//3.创建序列化流
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		
		//4.调用writeObjet();  将Student对象序列化。
		oos.writeObject(stu);
		
		//5.刷新
		oos.flush();
		
		//6.关闭资源
		oos.close();
		
		fos.close();

	}

}
